﻿using System.Data;
using System.Data.OleDb;

namespace IntelligentStorWpfApp.Helper
{
    public static class ExcelHelper
    {
        public static DataTable getExcelData(string excelPath)
        {
            DataTable dtGBPatient = new DataTable();

            string strConn;
           // string excelName;
            //excelName = excelPath.Substring(excelPath.LastIndexOf("\\")+1);
            //注意：把一个excel文件看做一个数据库，一个sheet看做一张表。语法 "SELECT * FROM [sheet1$]"，表单要使用"[]"和"$"

            // 1、HDR表示要把第一行作为数据还是作为列名，作为数据用HDR=no，作为列名用HDR=yes；
            // 2、通过IMEX=1来把混合型作为文本型读取，避免null值。
            strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='{0}';Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
            string strConnection = string.Format(strConn, excelPath);
            OleDbConnection conn = new OleDbConnection(strConnection);
            conn.Open();
            //返回Excel的架构，包括各个sheet表的名称,类型，创建时间和修改时间等  
            DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
            string[] strTableNames = new string[dtSheetName.Rows.Count];
            for (int k = 0; k < dtSheetName.Rows.Count; k++)
            {
                strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();
            }

            OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + strTableNames[0] + "]", strConnection);

            dtGBPatient.TableName = "products";
            oada.Fill(dtGBPatient);//获得datatable
            conn.Close();
            return dtGBPatient;
        }

        //public static DataSet getExcelDataOfCom(string path)
        //{

        //    DataSet reds = new DataSet();
        //    System.Data.DataTable dt = new System.Data.DataTable();
        //    try
        //    {
        //        Excel.Application app;
        //        Excel.Workbooks wbs;
        //        Excel.Worksheet ws;
        //        object oMissiong = System.Reflection.Missing.Value;
        //        app = new Excel.Application();  //lauch excel application
        //        wbs = app.Workbooks;
        //        wbs.Open(path, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong);
        //        ws = (Excel.Worksheet)app.Worksheets.get_Item(1);    //取得第一个工作薄
        //        int rows = ws.UsedRange.Rows.Count;
        //        int columns = ws.UsedRange.Columns.Count;
        //        dt.TableName = ws.Name;

        //        for (int i = 1; i <= rows; i++)
        //        {
        //            System.Data.DataRow dr = dt.NewRow();
        //            for (int j = 1; j <= columns; j++)
        //            {
        //                Excel.Range range = ws.get_Range(app.Cells[i, j], app.Cells[i, j]);
        //                range.Select();
        //                if (i == 1)                                  //读取列头
        //                {
        //                    string colName = "column" + j;
        //                    if (dt.Columns.Contains(colName))                      //是否存在重复列名
        //                    {
        //                        dt.Columns.Add(colName + j);
        //                    }
        //                    else { dt.Columns.Add(colName); }
        //                }
        //                dr[j - 1] = app.ActiveCell.Text.ToString();
        //            }
        //            dt.Rows.Add(dr);
        //        }

        //        app.Quit(); app = null;
        //        System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName("excel");
        //        foreach (System.Diagnostics.Process pro in procs)
        //        {
        //            pro.Kill();    //没有更好的方法,只有杀掉进程
        //        }
        //        GC.Collect();
        //        //dt.Rows.RemoveAt(0);       //上面那样写把列名也读进去了，在这里移除一下。也可以在上面把读列名单独出来
        //        reds.Tables.Add(dt);
        //        return reds;
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new Exception(ex.Message);
        //    }

        //    return reds;
        //}
    }
}
